<?php

namespace Maestros\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Maestros\Model\Entity\Materia;
use Maestros\Controller\Service\GenericService;
use Maestros\Model\Dao\MateriaDao;
use Maestros\Controller\Service\MateriaEjeService;
use Maestros\Controller\Service\PeriodoFaseService;
use Maestros\Controller\Service\TrayectoSemestreService;

class MateriaService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $materiaService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$materiaService == null) {
            self::$materiaService = new MateriaService($adapter);
        }
        return self::$materiaService;
    }

    public function getMateriaDao() {
        return MateriaDao::getInstance($this->dbAdapter);
    }

    public function getRegistro($id) {
        $data = null;
        $success = false;
        $materia = $this->obtenerMateriaSegunId($id);
        if ($materia->getId() != null) {
            $data[0] = $materia->objectToArray();
            ;
            $success = true;
            $mensaje = 'Materia Encontrada';
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data)
        );
        return $output;
    }

    public function getRegistroCompleto($id) {
        $materia = $this->obtenerMateriaSegunId($id);
        return $this->armarRegistroCompleto($materia);
    }

    public function armarRegistroCompleto($materia) {
        $mensaje = 'Materia no encontrado';
        $data = null;
        $success = false;
        $servicioMateriaEje = MateriaEjeService::getInstance($this->dbAdapter);
        $materiaEje = $servicioMateriaEje->obtenerMateriaEjeSegunId($materia->getMateriaEje());
        $servicioPeriodoFase = PeriodoFaseService::getInstance($this->dbAdapter);
        $periodoFase = $servicioPeriodoFase->obtenerPeriodoFaseSegunId($materia->getPeriodoFase());
        $servicioTrayectoSemestre = TrayectoSemestreService::getInstance($this->dbAdapter);
        $trayectoSemestre = $servicioTrayectoSemestre->obtenerTrayectoSemestreSegunId($materia->getTrayectoSemestre());
        if ($materia->getId() != null) {
            $data[0] = $materia->objectToArray();
            $success = true;
            $trayecto = $this->obtenerTrayecto($trayectoSemestre->getid());
            $data[0]['_trayectoSemestre'] = $trayecto;
            $data[0]['_periodoFase'] = $periodoFase->getDescripcion();
            $data[0]['_materiaEje'] = $materiaEje->getDescripcion();
            $mensaje = 'Materia ENCONTRADA';
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data),
            'mensaje' => $mensaje
        );
        return $output;
    }

    public function getRegistroCompletoDeMateria($id,$pensum) {
        $materia = $this->obtenerMateriaSegunId($id);
        return $this->armarRegistroCompletoDeMateria($materia,$pensum);
    }

    public function armarRegistroCompletoDeMateria($materia,$pensum) {
        $mensaje = 'Materia no encontrado';
        $data = null;
        $success = false;
        $servicioMateriaEje = MateriaEjeService::getInstance($this->dbAdapter);
        $materiaEje = $servicioMateriaEje->obtenerMateriaEjeSegunId($materia->getMateriaEje());
        $servicioPeriodoFase = PeriodoFaseService::getInstance($this->dbAdapter);
        $periodoFase = $servicioPeriodoFase->obtenerPeriodoFaseSegunId($materia->getPeriodoFase());
        $servicioTrayectoSemestre = TrayectoSemestreService::getInstance($this->dbAdapter);
        $trayectoSemestre = $servicioTrayectoSemestre->obtenerTrayectoSemestreSegunId($materia->getTrayectoSemestre());
        if ($materia->getId() != null) {
            $data = $materia->objectToArray();
            $success = true;
            $trayecto = $this->obtenerTrayecto($trayectoSemestre->getid());
            $data['_trayectoSemestre'] = $trayecto;
            $data['_periodoFase'] = $periodoFase->getDescripcion();
            $data['_materiaEje'] = $materiaEje->getDescripcion();
            $data['idpensum'] = $pensum;
            $mensaje = 'Materia ENCONTRADA';
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data),
            'mensaje' => $mensaje
        );
        return $output;
    }

    public function obtenerTrayecto($trayectoSemestre) {
        if ($trayectoSemestre == '0') {
            $trayecto = 'T0';
        }
        if ($trayectoSemestre == '1') {
            $trayecto = 'TI';
        }
        if ($trayectoSemestre == '2') {
            $trayecto = 'TII';
        }
        if ($trayectoSemestre == '3') {
            $trayecto = 'TIII';
        }
        if ($trayectoSemestre == '4') {
            $trayecto = 'TIV';
        }
        return $trayecto;
    }

    //------Retornan los objetos-------

    /**
     * Retorna un registro completo dado un id de malla de la tabla malla
     * @param $id type string
     * @return Objeto malla
     */
    public function obtenerMateriaSegunId($id) {
        $registros = $this->getMateriaDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $materia = new Materia($data[0]);
        $materia->setId($data[0]['id']);
        $materia->setCodigoExterno($data[0]['codigo_externo']);
        $materia->setNombre($data[0]['nombre']);
        $materia->setTrayectoSemestre($data[0]['id_trayecto_semestre']);
        $materia->setPeriodoFase($data[0]['id_periodo_fase']);
        $materia->setMateriaEje($data[0]['id_materia_eje']);
        $materia->setHorasHta($data[0]['horas_hta']);
        $materia->setHorasHti($data[0]['horas_hti']);
        $materia->setHorasHte($data[0]['horas_hte']);
        $materia->setHorasExtras($data[0]['horas_extras']);
        $materia->setHorasHtaFactor($data[0]['horas_hta_factor']);
        $materia->setHoraHtaFactorEgresado($data[0]['hora_hta_factor_egresado']);
        $materia->setCredito($data[0]['creditos']);

        return $materia;
    }

    public function getMateriasInscritasSegunCedulaYLapso($cedulaAlumno, $lapso) {
        $servicioMateriaEje = MateriaEjeService::getInstance($this->dbAdapter);
        $servicioPeriodoFase = PeriodoFaseService::getInstance($this->dbAdapter);
        $servicioTrayectoSemestre = TrayectoSemestreService::getInstance($this->dbAdapter);
        $materiasInscritas = null;
        $success = true;
        $registros = $this->getMateriaDao()->getMateriasInscritasSegunCedulaYLapso($cedulaAlumno, $lapso);
        $data = UtilsArrayController::llenarData($registros);
        if ($data != null) {
            for ($i = 0; $i < count($data); $i++) {
                $materia = new Materia($data[$i]);
                $materia->setId($data[$i]['id_materia']);
                $materia->setCodigoExterno($data[$i]['codigo_externo']);
                $materia->setNombre($data[$i]['nombre']);
                $materia->setTrayectoSemestre($data[$i]['id_trayecto_semestre']);
                $materia->setPeriodoFase($data[$i]['id_periodo_fase']);
                $materia->setMateriaEje($data[$i]['id_materia_eje']);
                $materia->setHorasHta($data[$i]['horas_hta']);
                $materia->setHorasHti($data[$i]['horas_hti']);
                $materia->setHorasHte($data[$i]['horas_hte']);
                $materia->setHorasExtras($data[$i]['horas_extras']);
                $materia->setHorasHtaFactor($data[$i]['horas_hta_factor']);
                $materia->setHoraHtaFactorEgresado($data[$i]['hora_hta_factor_egresado']);
                $materia->setCredito($data[$i]['creditos']);
                $trayectoSemestre = $servicioTrayectoSemestre->obtenerTrayectoSemestreSegunId($materia->getTrayectoSemestre());
                $trayecto = $this->obtenerTrayecto($trayectoSemestre->getid());
                $materiaEje = $servicioMateriaEje->obtenerMateriaEjeSegunId($materia->getMateriaEje());
                $periodoFase = $servicioPeriodoFase->obtenerPeriodoFaseSegunId($materia->getPeriodoFase());
                $materiasInscritas[$i] = $materia->objectToArray();
                $materiasInscritas[$i]['_trayectoSemestre'] = $trayecto;
                $materiasInscritas[$i]['_periodoFase'] = $periodoFase->getDescripcion();
                $materiasInscritas[$i]['_materiaEje'] = $materiaEje->getDescripcion();
                $materiasInscritas[$i]['_seccion'] = $data[$i]['seccion'];
                $materiasInscritas[$i]['_especialidad'] = $data[$i]['nombre_especialidad'];
                $materiasInscritas[$i]['_semestre'] = $data[$i]['id_semestre'];
                $materiasInscritas[$i]['_organizacionseccion'] = $data[$i]['idorganizacionseccion'];
            }
            $data = $materiasInscritas;
        }
        return array(
            'success' => $success,
            'data' => $data,
            'total' => count($data),
            'mensaje' => 'MENSAJE'
        );
    }

    //put your code here
}
